<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>正则表达式</title>
		<style>
			body{
				color: rgba(055,255,255,.5);
			}
		</style>
	</head>
	<body>
		
		<script type="text/javascript">
		
			
		
			/*
			## 1.正则表达式概述-处理字符串
			
			### 1.1什么是正则表达式--用一些api来验证字符串
			
			正则表达式（ Regular Expression ）是用于匹配字符串中字符组合的模式。在JavaScript中，正则表达式也是对象。
			正则表达式通常被用来检索、替换那些符合某个模式（规则）的文本，例如**验证表单**：用户名表单只能输入英文字母、数字或者下划线， 昵称输入框中可以输入中文(匹配)。此外，正则表达式还常用于过滤掉页面内容中的一些敏感词(替换)，或从字符串中获取我们想要的特定部分(提取)等 。
			其他语言也会使用正则表达式，本阶段我们主要是利用JavaScript 正则表达式完成表单验证。
			
			### 1.2 正则表达式的特点
			
			1. 灵活性、逻辑性和功能性非常的强。
			2. 可以迅速地用极简单的方式达到字符串的复杂控制。
			3. 对于刚接触的人来说，比较晦涩难懂。比如：^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
			4. 实际开发,一般都是**直接复制**写好的正则表达式. 但是要求会使用正则表达式并且根据实际情况修改正则表达式.   
			比如用户名:   /^[a-z0-9_-]{3,16}$/
			
			## 2.正则表达式在js中的使用
			
			### 2.1正则表达式的创建
			
			在 JavaScript 中，可以通过两种方式创建一个正则表达式。
			
			方式一：通过调用RegExp对象的构造函数创建  -可以使用变量
				var regexp = new RegExp(/123/);
				console.log(regexp);
			方式二：利用字面量创建 正则表达式	  --不可以使用变量
				 var rg = /123/;
			### 2.2正则使用的api
				  2.2.1.test
				 用法：正则.test(字符串)
				 test() 正则对象方法，用于检测字符串是否符合该规则，该对象会返回 true 或 false，其参数是测试字符串。
				 var rg = /123/;
				 console.log(rg.test(123));//匹配字符中是否出现123  出现结果为true
				 console.log(rg.test('abc'));//匹配字符中是否出现123 未出现结果为false
				 2.2.2 search的使用
				 查找符合某个正则的字符串,找到返回字符串的位置
				 let reg = /a/
				 let  st = 'b手动ba a asdsd'
				 console.log(st.search(reg));   4
				 2.2.3 match
				 查找符合符合正则表达式的值，返回一个数组
				 let reg = /a|b/g
				 let  st = 'b手动ba a asdsd'
				 console.log(st.match(reg));   // ['b', 'b', 'a', 'a', 'a']
				 2.2.4 replace
				 将符合正则的表达式进行替换
					let reg = /a|b/g
					let  st = 'b手动ba a asdsd'
					console.log(st.replace(reg,6));  /6手动66 6 6sdsd
			 
			## 3.正则表达式中的特殊字符
			
			### 3.1正则表达式的组成
			一个正则表达式可以由简单的字符构成，比如 /abc/，也可以是简单字符和特殊字符的组合，
			比如 /ab*c/ 。其中特殊字符也被称为元字符，在正则表达式中是具有特殊意义的专用符号，
			如 ^ 、$ 、+ 等。
			### 3.2边界符
			正则表达式中的边界符（位置符）用来提示字符所处的位置，主要有两个字符
			| 边界符 | 说明                           |
			| ------ | ------------------------------ |
			| ^      | 表示匹配行首的文本（以谁开始） |
			| $      | 表示匹配行尾的文本（以谁结束） |
			| .      | 表示匹配任意字符 除了 \n |
			案例  /abc/  /^abc/  /abc$/  /^abc$/
			如果 ^和 $ 在一起，表示必须是精确匹配。
			### 3.3字符类
			字符类表示有一系列字符可供选择，只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内。
			#### 3.3.1 [] 方括号
			 [abc]   abc其中一个   a|b|c
			 [a-z]  a-z所有字符
			 [A-Z]  A-Z所有字符
			表示有一系列字符可供选择，只要匹配其中一个就可以了
			区间的范围 以 ascill 码排序
			方括号里面的 ^  取反 只能放在 方括号里面的 最前面
			区间里面的 特殊字符   
			#### 3.3.2量词符  **
			量词符用来设定某个模式出现的次数。
			| 量词  | 说明            |
			| ----- | --------------- |
			| {n}   | 重复n次         |
			| {n,}  | 重复n次或更多次 |
			| {n,m} | 重复n到m次      |
			| *  ---{0,}   | 重复0次或更多次 |
			| +  ----{1,}  | 重复1次或更多次 |
			| ?   ----{0,1}  | 重复0次或1次    |
			
			
			#### 3.3.4 括号总结
			1.大括号 {} 量词符   里面表示重复次数   
			2.中括号 [] 字符集合 匹配方括号中的任意字符
			3.小括号 ()  表示优先级
			
			
			### 3.4预定义类   ( 转义字符)
			预定义类指的是某些常见模式的简写方式.
			转义符 ① 将有特殊意义的字符 转换成 普通字符
					② 配合一些特殊的字符使其有特殊意义
			\d [0-9] 匹配所有数字  
			\D [^0-9]匹配所有非数字	
			\w  匹配任意字母数字下划线  
			\W  匹配所有非字母数字下划线
			\s   匹配所有空格  \t\r\n\v\f
			\S   匹配所有非空格
			\b 独立部分     数字 字母  下划线  用于匹配英文单词
			\B 非独立部分 \n
			 
			### 3.5 修饰符
			i 忽略大小写
			g  全局匹配
			m  换行匹配
			
			
			
			4.捕获组  
			最新一次正则检测的子项  RegExp.$1  .... $9
			
			正则里面 捕获组  \1 \2 \3
			let reg = /(\d\d)\1/    7878
			
			
			
			
			5.正向断言  
			(?=XP)  相当于一个 附加条件   匹配后面必须是XP 但不取它 
			(?!XP)   相当于一个 附件条件   匹配必须不是XP 但不取它 
			注意 断言的()不属于子项
			let reg = /Window(?=XP)/
			let s = 'WindowXP'
			console.log(s.match(reg));  //[WindowXP]
			
			反向断言
			let st = `hello world`;
			let reg = /(?<!he)llo/
			let res = st.match(reg)
			console.log(res);
			
			
			匹配一个密码  必须包含( 大写字母  小写字母  数字  符号) 里面的三种
			
		
			
			*/
		</script>
	</body>
</html>
